spring boot rest api,控制返回json数据,过滤部分字段

您所在的位置:网站首页 springboot mongodb 忽略字段 spring boot rest api,控制返回json数据,过滤部分字段

spring boot rest api,控制返回json数据,过滤部分字段

2023-07-18 10:03| 来源: 网络整理| 查看: 265

前言

spirng boot:2.4.5

fastjson:1.2.7

当我们使用spring boot作为web服务端,接口采用restful api时,需要控制前端请求api的json数据格式,同时也需要控制服务端响应的json数据内容,可能出现以下场景:

json中某些属性,请求api和api响应中都需要忽略json中某些属性,请求api时忽略接收,api响应时需要携带json中某些属性,请求api时接收,api响应时忽略json中某些null值的属性,在api响应中忽略json中某些属性,api响应时属性名称进行修改同一实体,在不同方法调用下属性忽略配置各不相同

日常工作中基本就是以上场景的应用。

解决方案

同一实体在不同的过滤方案基本就是在对象的序列号和反序列号上进行操作实现的,这里我们通过以下几个注解实现上述的几种场景:

@JsonInclude @JsonProperty @JsonIgnore @JsonIgnoreProperties @JsonProperty @JsonView 场景一

json中某些属性,请求api和api响应中都需要忽略

忽略用户的编号和手机号

Tips:如果User实体进行参数接收的话,后端接收name字段,响应name字段

实现一 import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Data; import java.io.Serializable; @Data public class User implements Serializable { private static final long serialVersionUID = 5209364517621033304L; /** 编号 */ @JsonIgnore protected String id; /** 名称 */ protected String name; /** 手机号码 */ @JsonIgnore protected String phoneNumber; } 实现二 import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.Data; import java.io.Serializable; @Data @JsonIgnoreProperties(value = {"id", "phoneNumber"}) public class User implements Serializable { private static final long serialVersionUID = 5209364517621033304L; /** 编号 */ protected String id; /** 名称 */ protected String name; /** 手机号码 */ protected String phoneNumber; } 场景二

json中某些属性,请求api时忽略接收,api响应时需要携带

Tips:如果User实体进行参数接收的话,后端接收name、phoneNumber字段,响应id、name、phoneNumber字段

import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; import java.io.Serializable; @Data public class User implements Serializable { private static final long serialVersionUID = 5209364517621033304L; /** 编号 */ @JsonProperty(access = JsonProperty.Access.READ_ONLY) protected String id; /** 名称 */ protected String name; /** 手机号码 */ protected String phoneNumber; } 场景三

json中某些属性,请求api时接收,api响应时忽略

Tips:如果User实体进行参数接收的话,后端接收id、name、phoneNumber字段,响应name、phoneNumber字段

import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; import java.io.Serializable; @Data public class User implements Serializable { private static final long serialVersionUID = 5209364517621033304L; /** 编号 */ @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) protected String id; /** 名称 */ protected String name; /** 手机号码 */ protected String phoneNumber; } 场景四

json中某些null值的属性,在api响应中忽略

Tips:如果User实体进行参数接收的话,后端接收id、name、phoneNumber字段,响应时若id、name、phoneNumber字段为null值则忽略该字段

import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data; import java.io.Serializable; @Data @JsonInclude(JsonInclude.Include.NON_NULL) public class User implements Serializable { private static final long serialVersionUID = 5209364517621033304L; /** 编号 */ protected String id; /** 名称 */ protected String name; /** 手机号码 */ protected String phoneNumber; } 场景五

json中某些属性,api响应时属性名称进行修改

Tips:如果User实体进行参数接收的话,后端接收id、name、phoneNumber字段,响应id、name、phone字段,原本的phoneNumber被重命名为phone

import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; import java.io.Serializable; @Data public class User implements Serializable { private static final long serialVersionUID = 5209364517621033304L; /** 编号 */ protected String id; /** 名称 */ protected String name; /** 手机号码 */ @JsonProperty("phone") protected String phoneNumber; } 场景六

同一实体,在不同方法调用下属性忽略配置各不相同

Tips:如果User实体进行参数接收的话,后端接收id、name、phoneNumber字段,响应时如果方法配置相同@JsonView则为name、phoneNumber字段,如果在非@JsonView中响应id、name、phoneNumber字段

import com.fasterxml.jackson.annotation.JsonView; import com.demo.apis.TestApi; import lombok.Data; import java.io.Serializable; @Data public class User implements Serializable { private static final long serialVersionUID = 5209364517621033304L; /** 编号 */ protected String id; /** 名称 */ @JsonView(TestApi.class) protected String name; /** 手机号码 */ @JsonView(TestApi.class) protected String phoneNumber; } @RestController @RequestMapping("/api") public class TestApi { /** * 测试1 */ @GetMapping("/test1") @JsonView(TestApi.class) public User test1(User user){ return user; } /** * 测试2 */ @GetMapping("/test2") public User test2(User user){ return user; } }

请求参数如下: 

/api/test1响应如下:

 /api/test2响应如下:

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3